home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / gas_251.zip / bin_251 / binutils / sysinfo.y < prev    next >
Text File  |  1994-10-15  |  7KB  |  427 lines

  1. %{
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. extern char *word;
  6. extern char writecode;
  7. extern int number;
  8. extern int unit;
  9. char nice_name[1000];
  10. char *it;
  11. int sofar;
  12. int width;
  13. int code;
  14. char * repeat;
  15. char *oldrepeat;
  16. char *name;
  17. int rdepth;
  18. char *loop [] = {"","n","m","/*BAD*/"};
  19. char *names[] = {" ","[n]","[n][m]"};
  20. char *pnames[]= {"","*","**"};
  21. %}
  22.  
  23.  
  24. %union {
  25.  int i;
  26.  char *s;
  27. %token COND
  28. %token REPEAT
  29. %token '(' ')' '[' ']'
  30. %token <s> TYPE
  31. %token <s> NAME
  32. %token <i> NUMBER UNIT
  33. %type <i> attr_size 
  34. %type <s> attr_desc attr_id attr_type
  35. %%
  36.  
  37. top:  {
  38.   switch (writecode)
  39.     {
  40.     case 'i':
  41.       printf("#ifdef SYSROFF_SWAP_IN\n");
  42.       break; 
  43.     case 'p':
  44.       printf("#ifdef SYSROFF_p\n");
  45.       break; 
  46.     case 'd':
  47.       break;
  48.     case 'g':
  49.       printf("#ifdef SYSROFF_SWAP_OUT\n");
  50.       break;
  51.     case 'c':
  52.       printf("#ifdef SYSROFF_PRINT\n");
  53.       printf("#include <stdio.h>\n");
  54.       printf("#include <stdlib.h>\n");
  55.       break;
  56.     }
  57.  } 
  58. it_list {
  59.   switch (writecode) {
  60.   case 'i':
  61.   case 'p':
  62.   case 'g':
  63.   case 'c':
  64.     printf("#endif\n");
  65.     break; 
  66.   case 'd':
  67.     break;
  68.   }
  69. }
  70.  
  71.   ;
  72.  
  73.  
  74. it_list: it it_list
  75.   |
  76.   ;
  77.  
  78. it:
  79.     '(' NAME NUMBER 
  80.       {
  81.     it = $2; code = $3;
  82.     switch (writecode) 
  83.       {
  84.       case 'd':
  85.         printf("\n\n\n#define IT_%s_CODE 0x%x\n", it,code);
  86.         printf("struct IT_%s { \n", it);
  87.         break;
  88.       case 'i':
  89.         printf("void sysroff_swap_%s_in(ptr)\n",$2);
  90.         printf("struct IT_%s *ptr;\n", it);
  91.         printf("{\n");
  92.         printf("char raw[255];\n");
  93.         printf("\tint idx = 0 ;\n");
  94.         printf("\tint size;\n");
  95.         printf("memset(raw,0,255);\n");    
  96.         printf("memset(ptr,0,sizeof(*ptr));\n");
  97.         printf("size = fillup(raw);\n");
  98.         break;
  99.       case 'g':
  100.         printf("void sysroff_swap_%s_out(file,ptr)\n",$2);
  101.         printf("FILE * file;\n");
  102.         printf("struct IT_%s *ptr;\n", it);
  103.         printf("{\n");
  104.         printf("\tchar raw[255];\n");
  105.         printf("\tint idx = 16 ;\n");
  106.         printf("\tmemset (raw, 0, 255);\n");
  107.         printf("\tcode = IT_%s_CODE;\n", it);
  108.         break;
  109.       case 'o':
  110.         printf("void sysroff_swap_%s_out(abfd,ptr)\n",$2);
  111.         printf("bfd * abfd;\n");
  112.         printf("struct IT_%s *ptr;\n",it);
  113.         printf("{\n");
  114.         printf("int idx = 0 ;\n");
  115.         break;
  116.       case 'c':
  117.         printf("void sysroff_print_%s_out(ptr)\n",$2);
  118.         printf("struct IT_%s *ptr;\n", it);
  119.         printf("{\n");
  120.         printf("itheader(\"%s\", IT_%s_CODE);\n",$2,$2);
  121.         break;
  122.  
  123.       case 't':
  124.         break;
  125.       }
  126.  
  127.       } 
  128.     it_field_list 
  129. ')'
  130. {
  131.   switch (writecode) {
  132.   case 'd': 
  133.     printf("};\n");
  134.     break;
  135.   case 'g':
  136.     printf("\tchecksum(file,raw, idx, IT_%s_CODE);\n", it);
  137.     
  138.   case 'i':
  139.  
  140.   case 'o':
  141.   case 'c':
  142.     printf("}\n");
  143.   }
  144. }
  145. ;
  146.  
  147.  
  148.  
  149. it_field_list:
  150.         it_field it_field_list
  151.     |    cond_it_field it_field_list    
  152.     |    repeat_it_field it_field_list
  153.     |
  154.     ;
  155.  
  156. repeat_it_field: '(' REPEAT NAME
  157.     {
  158.       rdepth++;
  159.       switch (writecode) 
  160.         {
  161.         case 'c':
  162.           if (rdepth==1)
  163.           printf("\tprintf(\"repeat %%d\\n\", %s);\n",$3);
  164.           if (rdepth==2)
  165.           printf("\tprintf(\"repeat %%d\\n\", %s[n]);\n",$3);
  166.         case 'i':
  167.         case 'g':
  168.         case 'o':
  169.  
  170.           if (rdepth==1) 
  171.         {
  172.           printf("\t{ int n; for (n = 0; n < %s; n++) {\n",    $3);
  173.         }
  174.           if (rdepth == 2) {
  175.           printf("\t{ int m; for (m = 0; m < %s[n]; m++) {\n",    $3);
  176.         }        
  177.  
  178.           break;
  179.         }
  180.  
  181.       oldrepeat = repeat;
  182.          repeat = $3;
  183.     }
  184.  
  185.      it_field_list ')' 
  186.  
  187.     {
  188.       repeat = oldrepeat;
  189.       oldrepeat =0;
  190.       rdepth--;
  191.       switch (writecode)
  192.         {
  193.         case 'i':
  194.         case 'g':
  195.         case 'o':
  196.         case 'c':
  197.       printf("\t}}\n");
  198.     }
  199.     }
  200.        ;
  201.  
  202.  
  203. cond_it_field: '(' COND NAME
  204.     {
  205.       switch (writecode) 
  206.         {
  207.         case 'i':
  208.         case 'g':
  209.         case 'o':
  210.         case 'c':
  211.           printf("\tif (%s) {\n", $3);
  212.           break;
  213.         }
  214.     }
  215.  
  216.      it_field_list ')' 
  217.     {
  218.       switch (writecode)
  219.         {
  220.         case 'i':
  221.         case 'g':
  222.         case 'o':
  223.         case 'c':
  224.       printf("\t}\n");
  225.     }
  226.     }
  227.        ;
  228.  
  229. it_field:
  230.     '(' attr_desc '(' attr_type attr_size ')' attr_id 
  231.     {name = $7; } 
  232.     enums ')'
  233.     {
  234.       char *desc = $2;
  235.       char *type = $4;
  236.       int size = $5;
  237.       char *id = $7;
  238. char *p = names[rdepth];
  239. char *ptr = pnames[rdepth];
  240.       switch (writecode) 
  241.         {
  242.         case 'g':
  243.           if (size % 8) 
  244.         {
  245.           
  246.           printf("\twriteBITS(ptr->%s%s,raw,&idx,%d);\n",
  247.              id,
  248.              names[rdepth], size);
  249.  
  250.         }
  251.           else {
  252.         printf("\twrite%s(ptr->%s%s,raw,&idx,%d,file);\n",
  253.                type,
  254.                id,
  255.                names[rdepth],size/8);
  256.         }
  257.           break;          
  258.         case 'i':
  259.           {
  260.  
  261.         if (rdepth >= 1)
  262.  
  263.           {
  264.             printf("if (!ptr->%s) ptr->%s = (%s*)xcalloc(%s, sizeof(ptr->%s[0]));\n", 
  265.                id, 
  266.                id,
  267.                type,
  268.                repeat,
  269.                id);
  270.           }
  271.  
  272.         if (rdepth == 2)
  273.           {
  274.             printf("if (!ptr->%s[n]) ptr->%s[n] = (%s**)calloc(%s[n], sizeof(ptr->%s[n][0]));\n", 
  275.                id, 
  276.                id,
  277.                type,
  278.                repeat,
  279.                id);
  280.           }
  281.  
  282.           }
  283.  
  284.           if (size % 8) 
  285.         {
  286.           printf("\tptr->%s%s = getBITS(raw,&idx, %d,size);\n",
  287.              id,
  288.              names[rdepth], 
  289.              size);
  290.         }
  291.           else {
  292.         printf("\tptr->%s%s = get%s(raw,&idx, %d,size);\n",
  293.                id,
  294.                names[rdepth],
  295.                type,
  296.                size/8);
  297.         }
  298.           break;
  299.         case 'o':
  300.           printf("\tput%s(raw,%d,%d,&idx,ptr->%s%s);\n", type,size/8,size%8,id,names[rdepth]);
  301.           break;
  302.         case 'd':
  303.           if (repeat) 
  304.         printf("\t/* repeat %s */\n", repeat);
  305.  
  306.           if (type[0] == 'I') {
  307.           printf("\tint %s%s; \t/* %s */\n",ptr,id, desc);
  308.         }
  309.           else if (type[0] =='C') {
  310.           printf("\tchar %s*%s;\t /* %s */\n",ptr,id, desc);
  311.         }
  312.           else {
  313.         printf("\tbarray %s%s;\t /* %s */\n",ptr,id, desc);
  314.           }
  315.           break;
  316.         case 'c':
  317.           printf("tabout();\n");
  318.           printf("\tprintf(\"/*%-30s*/ ptr->%s = \");\n", desc, id);
  319.  
  320.           if (type[0] == 'I')
  321.           printf("\tprintf(\"%%d\\n\",ptr->%s%s);\n", id,p);
  322.           else   if (type[0] == 'C')
  323.           printf("\tprintf(\"%%s\\n\",ptr->%s%s);\n", id,p);
  324.  
  325.           else   if (type[0] == 'B') 
  326.             {
  327.           printf("\tpbarray(&ptr->%s%s);\n", id,p);
  328.         }
  329.           else abort();
  330.           break;
  331.         }
  332.     }
  333.  
  334.     ;
  335.  
  336.  
  337. attr_type:    
  338.      TYPE { $$ = $1; }
  339.      |  { $$ = "INT";}
  340.     ;
  341.  
  342. attr_desc: 
  343.     '(' NAME ')'    
  344.     { $$ = $2; }
  345.     ;
  346.  
  347. attr_size:
  348.      NUMBER UNIT 
  349.     { $$ = $1 * $2; }
  350.     ;
  351.  
  352.  
  353. attr_id:
  354.         '(' NAME ')'    { $$ = $2; }
  355.     |    { $$ = "dummy";}
  356.     ;    
  357.     
  358. enums: 
  359.     | '(' enum_list ')' ;
  360.  
  361. enum_list:
  362.     |
  363.     enum_list '(' NAME NAME ')' { 
  364.       switch (writecode) 
  365.         {
  366.         case 'd':
  367.           printf("#define %s %s\n", $3,$4);
  368.           break;
  369.         case 'c':
  370.         printf("if (ptr->%s%s == %s) { tabout(); printf(\"%s\\n\");}\n", name, names[rdepth],$4,$3);
  371.         }
  372.     }
  373.  
  374.     ;
  375.  
  376.  
  377.  
  378.  
  379. name:
  380.     NAME
  381.     {
  382.       printf("Got %s\n", word);
  383.     }
  384.     ;
  385.  
  386.  
  387.   
  388.  
  389.  
  390.  
  391.  
  392. %%
  393. /* four modes
  394.  
  395.    -d write structure defintions for sysroff in host format
  396.    -i write functions to swap into sysroff format in
  397.    -o write functions to swap into sysroff format out
  398.    -c write code to print info in human form */
  399.  
  400. int yydebug;
  401. char writecode;
  402.  
  403. int 
  404. main(ac,av)
  405. int ac;
  406. char **av;
  407. {
  408.   yydebug=0;
  409.   if (ac > 1)
  410.     writecode = av[1][1];
  411. if (writecode == 'd')
  412.   {
  413.     printf("typedef struct { unsigned char *data; int len; } barray; \n");
  414.     printf("typedef  int INT;\n");
  415.     printf("typedef  char * CHARS;\n");
  416.  
  417.   }
  418.   yyparse();
  419. return 0;
  420. }
  421.  
  422. int yyerror()
  423. {
  424.   printf("Error twathead\n");
  425. }
  426.